Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.
Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.
De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.
Het voorbeeld op deze pagina is geïnspireerd door een studie van Mell et al. (2021). Om praktische en didactische redenen werden de hypothesen en de data aangepast.
Lineaire regressie is een statistische techniek die je kan gebruiken om een hypothese te toetsen over het effect van een variabele (een onafhankelijke variabele of predictor) op een andere variabele (de afhankelijke variabele of uitkomst). In lineaire regressie is die afhankelijke variabele altijd continu, dus ten minste van intervalniveau.
Dit effect kan zelf ook variëren onder invloed van een andere variabele: in sommige omstandigheden is het effect groter dan in andere omstandigheden. Anders gezegd, het effect van een predictor op een afhankelijke variabele hangt af van de waarde van een derde variabele. In dat geval is er sprake van een interactie-effect.
Onderzoek heeft bijvoorbeeld uitgewezen dat er een effect is van iemands sociaal-economische status op het vertrouwen dat iemand heeft in anderen.
Nu vraag jij je af of dit effect verschillend is naargelang iemands familiale situatie. Je vermoedt met andere woorden dat iemands burgerlijke staat een effect heeft op het verband tussen sociaal-economische status en vertrouwen.
Via een modelvergelijkingstoets kan je toetsen of er een interactie-effect speelt.
Op deze pagina kom je te weten hoe je zo’n toets kan uitvoeren in R. De uitleg op deze pagina gaat over interactie tussen een categorische (meer bepaald een nominale) predictor en een continue predictor.
Zo goed als altijd zal je moeten controleren voor extra predictoren die het resultaat van de toetsing kunnen beïnvloeden.
Let op! De demonstratie hieronder leert je alleen hoe je een hypothese over een interactie-effect kan toetsen. Wil je daarnaast ook conclusies trekken over de hoofdeffecten in hetzelfde model, dan zijn er heel wat extra zaken om rekening mee te houden.1
Interactie-effecten in een lineair regressiemodel worden uitgebreid behandeld in deze cursus vanaf p.61. Er is ook een oefeningenreeks met uitgewerkte antwoorden beschikbaar.
De dataset dataVertrouwen
bevat gegevens van 7 variabelen geobserveerd bij 1217 Belgen.
Deze dataset kan je inladen met read.csv()
. De data kan je best meteen in een object dataVertrouwen
onderbrengen zodat je die later makkelijk opnieuw kan oproepen.
dataVertrouwen <- read.csv("https://statlas.ugent.be/datasets/vertrouwen.csv")
Met str()
krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken om je data te verkennen. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr
.
str(dataVertrouwen)
'data.frame': 1217 obs. of 7 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ vertrouwen: num 2.85 -3.74 -1.74 -2.71 0.22 ...
$ sesKind : num 0.296 4.213 0.317 0.296 4.856 ...
$ sesVolw : num -0.27 -2.33 2.48 2.48 1.09 ...
$ geslacht : chr "Man" "Man" "Vrouw" "Vrouw" ...
$ wrkls : chr "Ja" "Ja" "Nee" "Ja" ...
$ burgst : chr "nooit getrouwd" "feitelijk gescheiden" "getrouwd" "getrouwd" ...
In de output van str()
zie je inderdaad dat er 7 variabelen zijn met telkens 1217 observaties.
Categorische variabelen die je in je analyse wil gebruiken zet je best meteen om met de functie factor()
.
dataVertrouwen$burgst <- factor(dataVertrouwen$burgst)
dataVertrouwen$wrkls <- factor(dataVertrouwen$wrkls)
dataVertrouwen$geslacht <- factor(dataVertrouwen$geslacht)
Je kan een model bouwen met de functie lm()
. Het eerste argument van die functie is een formule waarin je specifieert welke variabelen je in het model wil opnemen:
~
+
predictoren waartussen je een interactie vermoedt gescheiden door een dubbele punt :
In het tweede argument bepaal je uit welk dataframe de variabelen komen. Hier is dat dataVertrouwen
.
Zo’n model kan je in een object met een eenvoudige naam stoppen.
modelInteractie <- lm(vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht + sesVolw:burgst, data = dataVertrouwen)
Om te weten hoe de categorische variabelen gecodeerd worden kan je de functie contrasts()
gebruiken. Standaard gebruikt R dummy-codering. Uit de output kan je leren dat feitelijk gescheiden
het referentieniveau is van de variabele burgst
. Meer over coderen en referentieniveaus vind je hier vanaf deel 3.
contrasts(dataVertrouwen$burgst) # variabele burgst moet hiervoor van class 'factor' zijn!
getrouwd nooit getrouwd samenlevingscontract
feitelijk gescheiden 0 0 0
getrouwd 1 0 0
nooit getrouwd 0 1 0
samenlevingscontract 0 0 1
weduwe/weduwnaar 0 0 0
wettelijk gescheiden 0 0 0
weduwe/weduwnaar wettelijk gescheiden
feitelijk gescheiden 0 0
getrouwd 0 0
nooit getrouwd 0 0
samenlevingscontract 0 0
weduwe/weduwnaar 1 0
wettelijk gescheiden 0 1
Met de functie summary()
kan je heel veel relevante informatie over het model oproepen. Als argument geef je gewoon het object modelInteractie
.
summary(modelInteractie)
Call:
lm(formula = vertrouwen ~ sesKind + sesVolw + burgst + wrkls +
geslacht + sesVolw:burgst, data = dataVertrouwen)
Residuals:
Min 1Q Median 3Q Max
-5.8342 -1.5216 -0.0299 1.5545 6.8221
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.369788 0.597570 0.619 0.5362
sesKind -0.072537 0.034503 -2.102 0.0357 *
sesVolw 0.237322 0.397933 0.596 0.5510
burgstgetrouwd -0.369897 0.580524 -0.637 0.5241
burgstnooit getrouwd -0.487481 0.590067 -0.826 0.4089
burgstsamenlevingscontract -1.361041 0.625996 -2.174 0.0299 *
burgstweduwe/weduwnaar 0.116909 0.689249 0.170 0.8653
burgstwettelijk gescheiden -0.758917 0.621254 -1.222 0.2221
wrklsNee 0.122261 0.185057 0.661 0.5090
geslachtVrouw -0.047136 0.125383 -0.376 0.7070
sesVolw:burgstgetrouwd 0.059790 0.400746 0.149 0.8814
sesVolw:burgstnooit getrouwd 0.142150 0.408257 0.348 0.7278
sesVolw:burgstsamenlevingscontract 0.115478 0.426700 0.271 0.7867
sesVolw:burgstweduwe/weduwnaar 0.004957 0.434946 0.011 0.9909
sesVolw:burgstwettelijk gescheiden 0.291220 0.418969 0.695 0.4871
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.148 on 1202 degrees of freedom
Multiple R-squared: 0.08346, Adjusted R-squared: 0.07279
F-statistic: 7.818 on 14 and 1202 DF, p-value: 4.586e-16
Deze output is interessant omdat je er de regressiecoëfficiënten in terugvindt, in de kolom Estimate. Daardoor kan je aflezen/berekenen wat het geschatte effect is van sesVolw
op vertrouwen
voor verschillende niveaus van burgst
. Bijvoorbeeld:
burgst
: het effect van sesVolw
is 0.2373221
getrouwd
van burgst
: het effect van sesVolw
is 0.2373221 \(+\) 0.0597898 \(=\) 0.2971119
De variabele burgst
is een nominale variabele met 6 niveaus, waardoor in deze output 5 rijen te vinden zijn die iets met het interactie-effect te maken hebben. Er is in deze output dus niet 1 toets die je iets vertelt over het bestaan van het interactie-effect. Bijgevolg kan je uit deze output nog niet concluderen of er sprake is van een interactie-effect. Daarvoor zal je een afzonderlijke toets moeten uitvoeren: een modelvergelijkingstoets (zie verder).
Hypothesetoetsing met lineaire regressie is enkel een bruikbare en betrouwbare techniek als aan een reeks voorwaarden is voldaan. Die moet je verifiëren vooraleer je met de interpretatie mag beginnen.
De Gauss-Markovassumpties en de normaliteitsassumptie van de fouten kan je nagaan met plot()
. Dit commando geeft je vier plots na elkaar. De eerste drie zijn relevant. In dit geval lijkt alles in orde en mag je verdergaan met de analyse.
Meer uitleg over de assumpties en deze plots vind je hier (vanaf 9.9).
plot(modelInteractie)
Merk op: zolang je enkel een toets uitvoert over het interactie-effect hoef je geen rekening te houden met mogelijke collineariteit met het interactie-effect. Zie over collineariteit in een lineair regressiemodel ook hier, de tweede alinea op p.65.
Je vraagt je af of het effect van sociaal-economische status op vertrouwen in andere mensen verschillend is naargelang iemands familiale situatie. Je vermoedt dus dat iemands burgerlijke staat (burgst
) een effect heeft op het verband tussen sesVolw
en vertrouwen
.
Dit kan je onderzoeken met behulp van een modelvergelijking. Dat houdt in dat je een model met een interactie tussen sesVolw
en burgst
vergelijkt met een model dat die interactieterm niet bevat, maar voor de rest wel identiek is. Als blijkt dat het model met die interactie beter fit met de data, dan kan je concluderen dat die betere fit te wijten is aan de interactieterm.
We controleren ook voor nog andere predictoren. Dat doen we omdat de conclusie over het bestaan van het interactie-effect kan afhangen van de aanwezigheid van die extra predictoren in het model. De algemene regel is: neem elke predictor op waarvan je denkt dat die gerelateerd is aan de afhankelijke variabele en/of aan andere predictoren in het model.
De nulhypothese stelt dat er geen interactie is. Het effect van sesVolw
op vertrouwen
is dan hetzelfde, ongeacht de waarde van burgst
. Als dat klopt, dan zullen we geen of nauwelijks betere predicties zien in het model mét interactieterm in vergelijking met het model zonder interactieterm.
De alternatieve hypothese stelt dat er wel interactie is, met andere woorden het effect van sesVolw
op vertrouwen
is verschillend in minstens één van de niveaus van burgst
.
Net als bij elke hypothesetoets moet je een significantieniveau kiezen. Hier kiezen we voor de veelgebruikte waarde \(\alpha = 0.05\).
Om te toetsen of burgst
een effect heeft op het verband tussen sesVolw
en vertrouwen
voer je een modelvergelijking uit. Eerst specifieer je een tweede model modelZonderInteractie
waarin de interactieterm burgst:sesVolw
niet is opgenomen.
modelZonderInteractie <- lm(vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht, data = dataVertrouwen)
Nu kan je de functie anova()
gebruiken. De output ervan zal je vertellen of het model met interactieterm burgst:sesVolw
je in staat stelt om over het algemeen betere predicties te maken van vertrouwen
dan het model zonder die interactieterm.
anova(modelZonderInteractie, modelInteractie)
Analysis of Variance Table
Model 1: vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht
Model 2: vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht +
sesVolw:burgst
Res.Df RSS Df Sum of Sq F Pr(>F)
1 1207 5563.2
2 1202 5547.9 5 15.327 0.6642 0.6507
De conclusie kan je trekken door de p-waarde te vergelijken met het eerder gekozen significantieniveau \(\alpha\). De p-waarde vind je in de meest rechtse kolom genaamd Pr(>F).
In dit geval is 0.6507263 een pak groter dan 0.05. Je kan dus de nulhypothese niet verwerpen.
Een interactie-effect kan je visualiseren. Daarbij toon je het effect van één predictor op de afhankelijke variabele, bij verschillende waarden van de andere predictor. Hiervoor heb je het R-package effects
nodig.
install.packages('effects') # eenmalig het package installeren
library(effects) # bij de start van elke sessie moet je het package laden
plot(effect('sesVolw:burgst', modelInteractie),
x.var='sesVolw', # plaatst deze variabele op de horizontale as van elk paneel
axes=list(grid=TRUE) # optioneel
)
Uit de modelvergelijking bleek al dat er geen duidelijk interactie-effect speelde. Zie je dat ook terug in de plots?
De helling van de rechte verschilt niet zoveel in de 6 plots. Het effect van sesVolw
op vertrouwen
is dus min of meer hetzelfde, ongeacht de waarde van burgst
.
Aan de hand van modelInteractie
kan je predicties berekenen voor gelijk welke waarden van de predictoren. Die waarden zouden kunnen afkomstig zijn van een nieuw iemand, die bijvoorbeeld niet in de steekproef zat. Voor die nieuwe persoon krijg je een predictie van de waarde van vertrouwen
.
nieuwPersoon <- data.frame(sesKind=mean(dataVertrouwen$sesKind),
sesVolw=mean(dataVertrouwen$sesVolw),
burgst='feitelijk gescheiden',
wrkls='Ja',
geslacht='Man')
predict(modelInteractie, nieuwPersoon)
1
0.369788
Meer uitleg over de precieze berekening van predicties vind je hier vanaf 1.(a).
Meer bepaald zal je je moeten bewust zijn van:
Mell H., Safra L., Demange P., Algan Y., Baumard N. & Chevallier C. (2021). Early life adversity is associated with diminished social trust in adults. Political Psychology. doi: 10.1111/pops.12756